iT邦幫忙

1

Python 內建函式: enumerate()在迭代中同時獲取索引和值

  • 分享至 

  • xImage
  •  

什麼是 enumerate() 函式?

是一個工具,可以迭代/遍歷一個可迭代對象,然後產出隱性的索引和值的元組。

enumerate() 函式是一個內建的 Python 函式,
用於在迭代一個可迭代對象(如列表、元組、字符串等)時,
同時得到元素的隱性索引和值的元組。
它會返回一個 enumerate object,該對象可以被迭代,每次迭代返回一個包含索引和值的元組

enumerate object 的特性:

  • 迭代器: 它是一種迭代器,可以被用在 for 迴圈中。
  • 索引開始值: 可以通過 start 參數指定索引的起始值,默認從 0 開始。
  • 懶惰求值: enumerate object 只有在需要的時候才會計算下一個元素,這有助於提高效率。

enumerate() 函式的語法
enumerate(iterable, start=0)

  • iterable: 要迭代的可迭代對象。
  • start: 索引開始的值,默認為 0。
fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits):
    print(index, fruit)
輸出結果:
0 apple
1 banana
2 cherry

enumerate() 的常見用法

  • 在 for 迴圈中同時獲取索引和值: 這是 enumerate() 最常見的用法,它可以讓我們在遍歷一個序列時,方便地跟踪當前元素的索引。
  • 創建字典: 將 enumerate() 的結果與 zip() 函式結合,可以快速創建一個字典,其中鍵為索引,值為對應的元素。
  • 其他應用: enumerate() 還可以用於許多其他場景,例如:
    • 在列表推導式中使用
    • 與其他函式結合使用,如 map()、filter() 等

enumerate() 的優點

簡潔: 相比於手動維護一個計數器,enumerate() 提供了一種更簡潔的方式來獲取索引和值。
易讀: enumerate() 的語法直觀,易於理解。
靈活: 可以自定義索引的起始值。

更多示例

# 指定索引從 1 開始
for index, char in enumerate("hello", start=1):
    print(index, char)

# 創建一個字典
fruits = ['apple', 'banana', 'cherry']
fruit_dict = dict(enumerate(fruits))
print(fruit_dict)  # 输出:{0: 'apple', 1: 'banana', 2: 'cherry'}

為什麼要使用 dict()?

dict(...):這個部分會將 enumerate() 產生的元組轉換成一個字典。字典是由鍵值對組成的,每個元組的第一个元素(索引)會作為字典的鍵,第二个元素(水果名稱)會作為字典的值。

  • 為什麼要轉換成字典?
    • 方便索引: 將水果名稱與索引關聯起來,方便我們通過索引直接獲取對應的水果名稱。
    • 快速查找: 字典的查找效率很高,可以快速根據索引找到對應的值。
    • 其他操作: 字典提供了豐富的操作方法,例如添加、刪除、修改鍵值對等。
fruit_dict = dict(enumerate(fruits))
print(fruit_dict['apple'])  # 輸出:Traceback (most recent call stack) ... KeyError: 'apple'
print(fruit_dict[0])  # 輸出:apple

這個例子中,我們將 enumerate() 的結果轉換為字典,以便快速根據索引查找對應的水果。

  • 錯誤示範: 直接用水果名稱作為鍵去查找會報錯,因為字典的鍵是索引。
  • 正確用法: 應該用索引作為鍵去查找對應的水果名稱。

何時不需要轉換成字典 使用 dict(enumerate(fruits))?

  • 只需要迭代: 如果只是想順序地遍歷每個元素,並不需要根據索引來查找,那麼直接使用 for 迴遍歷 enumerate() 產生的元組即可。
  • 記憶體限制: 如果序列非常長,將其轉換為字典可能會占用過多的記憶體。
  • 不需要修改: 如果不需要對索引-值對進行修改,那麼使用元組或列表可能更適合。
    舉例說明:
fruits = ['apple', 'banana', 'cherry']
fruit_counts = {}
for index, fruit in enumerate(fruits):
    fruit_counts[fruit] = fruit_counts.get(fruit, 0) + 1

這個例子中,我們不需要將 enumerate() 的結果轉換為字典,而是直接使用 for 迴圈來統計每個水果出現的次數。

如何將 enumerate() 與 zip() 結合,快速創建一個字典:

Python 內建函式 zip() & [list] 運用

複雜的資料結構

students = ['Alice', 'Bob', 'Charlie']
scores = [85, 92, 78]
grades = ['A', 'A', 'B']

# 創建一個字典,每個學生對應一個包含成績和等級的元組
student_data = dict(zip(enumerate(students), zip(scores, grades)))
print(student_data)

輸出:

{(0, 'Alice'): (85, 'A'), (1, 'Bob'): (92, 'A'), (2, 'Charlie'): (78, 'B')}

解釋:

  1. zip(scores, grades) 將成績和等級配對,形成一個包含 (成績, 等級) 元組的迭代器。
  2. zip(enumerate(students), zip(scores, grades)) 將學生姓名、成績和等級三者配對,形成一個新的迭代器。
  3. dict() 將這個新的迭代器轉換成字典,每個學生姓名對應一個包含成績和等級的元組。

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言